﻿//using Aliyun.OSS;
//using System;
//using System.Collections.Generic;
//using System.IO;

//public partial class OssManager
//{
//    public class GetObject
//    {
//        private readonly OssManager m_owner;

//        public string RemotePath { get; private set; }
//        public string BackUpPath { get; private set; }
//        public string LocalPath { get; private set; }

//        public StreamTransferProgressArgs ProgressArgs { get; set; }

//        public Action<GetObject> OnProgress;
//        public Action<GetObject> OnComplete;

//        public object state;

//        private FileStream fs;

//        public bool IsComplete { get; private set; }

//        public bool IsError { get; private set; }
//        public Queue<string> ErrorMessage { get; set; }

//        public GetObject(OssManager owner)
//        {
//            m_owner = owner;
//            IsComplete = false;
//            IsError = false;
//            ErrorMessage = new Queue<string>();
//            ErrorMessage.Clear();
//        }

//        public void SetInfo(string remote_path, string local_path)
//        {
//            RemotePath = remote_path;
//            LocalPath = local_path;
//        }

//        public void Start()
//        {
//            try
//            {
//                BackUpPath = $"{LocalPath}.download";

//                long start_idx = 0;
//                if (File.Exists(BackUpPath) == true)
//                {
//                    fs = File.OpenWrite(BackUpPath);
//                    fs.Seek(0, SeekOrigin.End);
//                    start_idx = fs.Length;
//                }
//                else
//                {
//                    string directory = Path.GetDirectoryName(BackUpPath);
//                    if (Directory.Exists(directory) == false)
//                    {
//                        Directory.CreateDirectory(directory);
//                    }
//                    fs = new FileStream(BackUpPath, FileMode.Create, FileAccess.Write);
//                    start_idx = 0;
//                }
//                var getObjectRequest = new GetObjectRequest(m_owner.m_bucket_name, RemotePath);
//                getObjectRequest.SetRange(start_idx, -1);
//                getObjectRequest.StreamTransferProgress += OnProgressHandler;

//                var obj = m_owner.mOss.BeginGetObject(getObjectRequest, GetObjectCallback, this);

//                //m_download_event.WaitOne();
//            }
//            catch (Exception ex)
//            {
//                IsError = true;
//                ErrorMessage.Enqueue("Start");
//                ErrorMessage.Enqueue(ex.Message);
//            }
//        }

//        private void OnProgressHandler(object sender, StreamTransferProgressArgs e)
//        {
//            ProgressArgs = e;
//            ErrorMessage.Enqueue($"OnProgressHandler PercentDone={e.PercentDone}; Bytes1={e.TransferredBytes}; Bytes2={e.IncrementTransferred}; BackUpPath={BackUpPath};");
//            OnProgress?.Invoke(this);
//        }

//        private void GetObjectCallback(IAsyncResult ar)
//        {
//            try
//            {
//                var obj = m_owner.mOss.EndGetObject(ar);

//                var state = ar.AsyncState as GetObject;
//                using (var requestStream = obj.Content)
//                {
//                    byte[] buf = new byte[1024 * 1024];
//                    var len = 0;
//                    while ((len = requestStream.Read(buf, 0, buf.Length)) > 0)
//                    {
//                        state.fs.Write(buf, 0, len);
//                    }
//                    state.fs.Close();
//                }
//                File.Copy(state.BackUpPath, state.LocalPath, File.Exists(state.LocalPath));
//                File.Delete(state.BackUpPath);
//                IsComplete = true;
//                OnComplete?.Invoke(this);

//            }
//            catch (Exception ex)
//            {
//                ErrorMessage.Enqueue("GetObjectCallback");
//                ErrorMessage.Enqueue(ex.Message);

//                IsError = true;
//            }
//            finally
//            {
//                //m_download_event.Set();
//            }
//        }
//    }
//}
